package com.bird.设计模式.创建型.单例模式.懒汉单例;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * <懒汉式单例模式>
 * 1：什么是懒汉式单例:
 * 单例的意思就是一个类的对象 在任何情况下有且仅有一个实例。
 * 懒汉的意思就是在初始化化的不创建类的实例 在使用的时候创建类的实例。
 * 2：缺点,原因:
 * 是线程不安全的。在多线程访问的情况下会创建多个实例。
 * 3：改进方式:
 * 改进一：在创建类的对象的时候可以加锁。
 * <p>
 * </懒汉式单例模式>
 */

/**
 * @data 2022/2/14 12:20
 * @author: bird
 * @description: 懒汉式单例模式:
 * 懒汉式单例的特点： 在初始化的时候不加载 在使用的时候再创建......
 */
public class LazySingleton {
    private static LazySingleton lazySingleton = null;
    // 标记位
    private static boolean flag = true;
    //这种方式 对于反射来说,也是不能防止反射攻击的.
    private LazySingleton() {
        if (flag) {
            flag = false;
        } else {
            throw new RuntimeException("单例构造器禁止反射调用");
        }
    }

    // 懒汉式单例模式 在多线程访问的情况下是不安全， 原因是会创建两个对象的情况。
    public static LazySingleton getInstance() {
        if (null == lazySingleton) {
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }


    private static Lock lock = new ReentrantLock();
    // 可以通过加锁的方式 保证线程安全
    public static LazySingleton getInstanceThreadSafe() {
        lock.lock();
        try {
            if (null == lazySingleton) {
                lazySingleton = new LazySingleton();
            }
        } finally {
            lock.unlock();
        }
        return lazySingleton;
    }
}